package gestionBulletins.view;

import gestionBulletins.model.Adherent;
import gestionBulletins.model.Enfant;
import gestionBulletins.model.persistance.DaoAdherent;
import gestionBulletins.model.persistance.DaoEnfant;
import gestionBulletins.model.persistance.DaoFactory;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class AddEnfantWindow extends JDialog implements ActionListener, FocusListener {

	private static final long serialVersionUID = 1L;
	protected InfosEnfantsWindow iew;
	protected DaoFactory daoFactory;
	protected JButton boutonAjouter;
	protected JButton boutonSortir;
	protected JTextField inputNomEnfant;
	protected JTextField inputPrenomEnfant;
	protected JTextField inputDateJourEnfant;
	protected JTextField inputDateMoisEnfant;
	protected JTextField inputDateAnneeEnfant;
	protected JComboBox inputSexeEnfant;
	protected int idParent;
	protected int nbEnfantsRemaining = 0;
	protected boolean modification = false;
	
	
	public AddEnfantWindow(DaoFactory daoFactory, int id, boolean modif, int nbEnfantsAAjouter) {
		super();
		iew = null;
		nbEnfantsRemaining = nbEnfantsAAjouter;
		this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		this.daoFactory = daoFactory;
		this.modification = modif;
		idParent = id;
		setTitle("Ajout d'un enfant");
		initComposantsGraphiques();
		bindToListener();
		setupFrame();
		pack();
		/* position au milieu de l'écran */
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		this.setLocation((dim.width - getSize().width) / 2,
						 (dim.height - getSize().height) / 2);
	}
	
	private void initComposantsGraphiques() {
		boutonAjouter = new JButton("Ajouter enfant");
		boutonSortir = new JButton("Sortir");
		inputNomEnfant = new JTextField();
		inputPrenomEnfant = new JTextField();
		inputDateJourEnfant = new JTextField();
		inputDateJourEnfant.setText("jour");
		inputDateMoisEnfant = new JTextField();
		inputDateMoisEnfant.setText("mois");
		inputDateAnneeEnfant = new JTextField();
		inputDateAnneeEnfant.setText("année");
		String[] sexes = { "Garçon", "Fille" };
		inputSexeEnfant = new JComboBox(sexes);
	}
	
	private void bindToListener() {
		boutonAjouter.addActionListener(this);
		boutonSortir.addActionListener(this);
		inputDateJourEnfant.addFocusListener(this);
		inputDateMoisEnfant.addFocusListener(this);
		inputDateAnneeEnfant.addFocusListener(this);
	}

	private void setupFrame() {
		Container pane = getContentPane();
		pane.setLayout(new BorderLayout());
		
		/* -------------- entete et bas de page -------------- */
		/* entete */
		JPanel panelEntete = new JPanel();
		panelEntete.add(new JLabel("Ajouter un enfant"));
		pane.add(panelEntete, BorderLayout.NORTH);
		/* bas de page */
		JPanel panelBasDePage = new JPanel();
		panelBasDePage.add(boutonAjouter);
		panelBasDePage.add(boutonSortir);
		pane.add(panelBasDePage, BorderLayout.SOUTH);
		
		/* formulaire */
		GridLayout layoutFormulaireAddEnfant = new GridLayout(0, 2);
		JPanel pf = new JPanel(layoutFormulaireAddEnfant);
		pf.add(new JLabel("Sexe de l'enfant: "));
		pf.add(inputSexeEnfant);
		pf.add(new JLabel("Nom de l'enfant: "));
		pf.add(inputNomEnfant);
		pf.add(new JLabel("Prénom de l'enfant: "));
		pf.add(inputPrenomEnfant);
		pf.add(new JLabel("Date de naissance: "));
		JPanel datePanelEnfant = new JPanel();
		datePanelEnfant.setLayout(new BoxLayout(datePanelEnfant, BoxLayout.LINE_AXIS));
		datePanelEnfant.add(inputDateJourEnfant);
		datePanelEnfant.add(inputDateMoisEnfant);
		datePanelEnfant.add(inputDateAnneeEnfant);
		pf.add(datePanelEnfant);
		pane.add(pf);
		
		/* marge de gauche et droite */
		pf.setBorder(new EmptyBorder(10, 10, 10, 10));
		
		setModal(true);
		
	}
	
	protected boolean verifierFormulaire() {
		
		if ("".compareTo(inputNomEnfant.getText()) == 0) {
			return false;
		}
		
		if ("".compareTo(inputPrenomEnfant.getText()) == 0) {
			return false;
		}
		
		if ("jour".compareTo(inputDateJourEnfant.getText()) == 0) {
			return false;
		}
		
		if ("mois".compareTo(inputDateMoisEnfant.getText()) == 0) {
			return false;
		}
		
		if ("année".compareTo(inputDateAnneeEnfant.getText()) == 0) {
			return false;
		}
		
		return true;
	}
	
	protected void resetFormulaire() {
		inputSexeEnfant.setSelectedIndex(0);
		inputNomEnfant.setText("");
		inputPrenomEnfant.setText("");
		inputDateJourEnfant.setText("jour");
		inputDateMoisEnfant.setText("mois");
		inputDateAnneeEnfant.setText("année");
		
		/* si on a finit d'ajouter tout les enfants on ferme la fenetre */
		if (!modification && nbEnfantsRemaining <= 0) {
			this.setVisible(false);
		}
	}
	
	public void setObserver(InfosEnfantsWindow iew) {
		this.iew = iew;
	}
	
	protected void notifyObserver() {
		iew.repaint();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == boutonSortir) {
			resetFormulaire();
			this.setVisible(false);
		}
		if (e.getSource() == boutonAjouter) {
			if (verifierFormulaire()) {
				DaoEnfant de = daoFactory.getDaoEnfant();
				Enfant enfant = null;
				int idEnfant = de.requestIdByNomPrenom(inputNomEnfant.getText(), inputPrenomEnfant.getText());
				if (idEnfant != -1) {
					enfant = de.requestById(idEnfant);
				}
				else {
					enfant = new Enfant(inputNomEnfant.getText(), inputPrenomEnfant.getText());
					enfant.setDateNaissanceAnnee(inputDateAnneeEnfant.getText());
					enfant.setDateNaissanceJour(inputDateJourEnfant.getText());
					enfant.setDateNaissanceMois(inputDateMoisEnfant.getText());
					enfant.setSexe((String)inputSexeEnfant.getSelectedItem());
				}
				DaoAdherent daoAdherent = daoFactory.getDaoAdherent();
				Adherent parent = daoAdherent.requestById(idParent);
				if ("Mr".compareTo(parent.getEtatCivil()) == 0) {
					enfant.setPere(idParent);
				}
				else {
					enfant.setMere(idParent);
				}
				
				nbEnfantsRemaining--;
				enfant = de.create(enfant);
				resetFormulaire();
				
				/* et je notifie la table des enfants des changements */
				if (modification) {
					notifyObserver();
				}
			}
			else {
				/*
				 * http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html
				 */
				JOptionPane.showMessageDialog(this, "Erreur de saisie ! vérifiez le formulaire svp");
			}
		}
		
	}

	@Override
	public void focusGained(FocusEvent e) {
		if (e.getSource() == inputDateJourEnfant) {
			if(inputDateJourEnfant.getText().compareTo("jour") == 0) {
				inputDateJourEnfant.setText("");
			}
		}
		if (e.getSource() == inputDateMoisEnfant) {
			if(inputDateMoisEnfant.getText().compareTo("mois") == 0) {
				inputDateMoisEnfant.setText("");
			}
		}
		if (e.getSource() == inputDateAnneeEnfant) {
			if(inputDateAnneeEnfant.getText().compareTo("année") == 0) {
				inputDateAnneeEnfant.setText("");
			}
		}
		
	}

	@Override
	public void focusLost(FocusEvent e) {
		if (e.getSource() == inputDateJourEnfant) {
			if(inputDateJourEnfant.getText().length() == 0) {
				inputDateJourEnfant.setText("jour");
			}
		}
		if (e.getSource() == inputDateMoisEnfant) {
			if(inputDateMoisEnfant.getText().length() == 0) {
				inputDateMoisEnfant.setText("mois");
			}
		}
		if (e.getSource() == inputDateAnneeEnfant) {
			if(inputDateAnneeEnfant.getText().length() == 0) {
				inputDateAnneeEnfant.setText("année");
			}
		}
		
	}

	public static void main(String[] args) {
		AddEnfantWindow window = new AddEnfantWindow(null,69,false,1);
		window.setVisible(true);
	}


	
}
